package com.mlk.rbac.listener;

import com.mlk.core.config.DictConfig;
import com.mlk.core.util.DictUtils;
import com.mlk.core.util.JSONUtils;
import com.mlk.rbac.dto.SysDictDTO;
import com.mlk.rbac.mapper.SysDictMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 一个spring容器的监听器
 * 当容器启动完之后,会从数据库之中将数据字典的内容加载到redis缓存之中.
 * 当后面使用数据字典的时候,可以直接从redis缓存之中获取内容,减少对数据库的压力.
 * @author xulu
 */
@Component
@Slf4j
public class DictListener implements ApplicationListener<ContextRefreshedEvent> {
    @Resource
    private SysDictMapper sysDictMapper;

    /**
     * 监听容器事件,容器的刷新完成事件
     * @param applicationEvent
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent applicationEvent) {
        log.debug("init dictValue to redis");
        // 从数据库之中获取所有的数据内容
        List<SysDictDTO> items = sysDictMapper.queryAllDictItem(null);
        DictUtils.refreshCache(items);
    }
}
